`timescale 1ns / 1ps
/////////////////////////////////////////////////////////////////////////////
////                                                                     ////
//// Instituto Tecnologico de Costa Rica                                 ////
////                                                                     ////
//// Semaforo                                                            ////
////                                                                     ////
//// Este archivo es parte del proyecto: Control de luces de semaforo    ////
//// http://repositorio-charmander.googlecode.com/svn/trunk/             ////
////                                                                     ////
//// Descripcion                                                         ////
//// Implementacion de un control de luces de semaforo como un proyecto  ////
//// del curso de Taller de Diseño Logico.                               ////
////                                                                     ////
//// Funcionamiento:                                                     ////
//// - Modulo principal del proyecto, este tendrá instancias a todos los ////
////   demás módulos del proyecto, ya que  este módulo se le introduciran////
////   los valores seleccionados por el usuario.                         ////
////                                                                     ////                                    
//// Autores:                                                            ////
//// - Gia Chen, kathya0812@gmail.com                                    ////
////   Edgar Rojas, edtec217@gmail.com                                   ////
////                                                                     ////
/////////////////////////////////////////////////////////////////////////////
module Semaforo( _clk_i, sensor_i, walk_request_i, reprogram_i, Time_Parameter_Selector_i, Time_Value_i, _rst_i,
					  Rm_o, Ym_o, Gm_o, Rs_o, Ys_o, Gs_o, walk_o,segmentos_o);
	 
	 //ENTRADAS
	 //Clock
	 input _clk_i;
	 //Señales de control
	 input sensor_i;
	 input walk_request_i;
	 input reprogram_i;
	 //Valores escogidos por el usuario
	 input[1:0] Time_Parameter_Selector_i;
	 input[3:0] Time_Value_i;
	 //Reset
	 input _rst_i;
	 
	 //SALIDAS
	 //Luces del semáforo
	 output wire Rm_o, Ym_o, Gm_o, Rs_o, Ys_o, Gs_o, walk_o;
	 output wire[3:0] segmentos_o;
	 
	 //WIRES
	 wire wire_Sensor_Sync, wire_WR_Sync, wire_Prog_Sync, wire_Hz_enable, 
			wire_expired, wire_start_timer, wire_WR, wire_WR_Reset, wire_Reset_Sync;
	 wire[1:0] wire_interval;
	 wire[3:0] wire_value;
			
	 //ININICALIZACION DE LOS MÓDULOS DEL CONTROLADOR DE LUCES DE SEMAFORO
	 //Sincronizador
	 Sincronizador Synchonizer (._clk_i(_clk_i), .sensor_i(sensor_i), .sensor_sync_o(wire_Sensor_Sync), 
										 .walk_request_i(walk_request_i), .WR_sync_o(wire_WR_Sync), .reprogram_i(reprogram_i),
										 .prog_sync_o(wire_Prog_Sync), ._rst_i(_rst_i), ._sync_rst_o(wire_Reset_Sync));							 
	 //Divider
	 Divider Divisor (._clk_i(_clk_i), ._sync_rst_i(wire_Reset_Sync), .HzActivado_o(wire_Hz_enable));
	 
	 //Time Parameters
	 Time_Parameters Parametrizador (._clk_i(_clk_i), ._sync_rst_i(wire_Reset_Sync), .Time_Value_i(Time_Value_i), 
												.Time_Parameter_Selector_i(Time_Parameter_Selector_i), .prog_sync_i(wire_Prog_Sync),
												.interval_i(wire_interval), .value_o(wire_value));
	 //Timer
	 Timer Temporalizador (._clk_i(_clk_i), ._sync_rst_i(wire_Reset_Sync), .HzActivado_i(wire_Hz_enable), 
								  .value_i(wire_value), .start_timer_i(wire_start_timer),.walk_i(walk_o), .expired_o(wire_expired),
								  .segmentos_o(segmentos_o));
	 
	 //Walk Register
	 WalkRegister Walk_Register (._clk_i(_clk_i), .WR_sync_i(wire_WR_Sync), .Walk_Request_o(wire_WR),
	  									  ._WR_rst_i(wire_WR_Reset), ._sync_rst_i(wire_Reset_Sync)); 
   //Máquina de Estados Finitos
	MaquinaEstadosFinitos FSM (._clk_i(_clk_i), .sensor_sync_i(wire_Sensor_Sync), .Walk_Request_i(wire_WR), 
										.prog_sync_i(wire_Prog_Sync), .expired_i(wire_expired), ._sync_rst_i(wire_Reset_Sync),
										.Rm_o(Rm_o), .Ym_o(Ym_o), .Gm_o(Gm_o), .Rs_o(Rs_o), .Ys_o(Ys_o), .Gs_o(Gs_o), .walk_o(walk_o), 
										.start_timer_o(wire_start_timer), .interval_o(wire_interval), ._WR_rst_o(wire_WR_Reset));

endmodule
